package controller;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

@WebServlet(name = "DownloadServlet", value = "/download")
public class DownLoadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取要下载的文件名
        String fileName = request.getParameter("fileName");
        // 设置响应头
        //当浏览器在请求资源时，会通过http返回头中的content-type决定如何显示/处理将要加载的数据，
        // 如果这个类型浏览器能够支持阅览，浏览器就会直接展示该资源，比如png、jpeg、video等格式。
        // 在某些下载文件的场景中，服务端可能会返回文件流，并在返回头中带上
        // Content-Type:application/octet-stream，告知浏览器这是一个字节流，浏览器
        // 处理字节流的默认方式就是下载。
        //Application/octet-stream是应用程序文件的默认值。意思是未知的应用程序文件，浏览器一般
        // 不会自动执行或询问执行。浏览器会像对待设置了HTTP头Content-Disposition值为
        // attachment的文件一样来对待这类文件，即浏览器会触发下载行为。
        response.setContentType("application/octet-stream");
        //浏览器并不认得这是什么类型，也不知道应该如何展示，只知道这是一种二进制文件，因此遇到
        // content-type为application/octet-stream的文件时，浏览器会直接把它下载下来。
        // 这个类型一般会配合另一个响应头Content-Disposition,该响应头指示回复的内容该
        // 以何种形式展示，是以内联的形式（即网页或者网页的一部分
        // Content-Disposition:inline;filename=”example.pdf”），还是以附件的形式下载
        // 并保存到本地。
        response.addHeader("Content-Disposition","attachment;filename="+fileName);
        //获取服务器上将要被下载的文件流
        InputStream inputStream = getServletContext().getResourceAsStream("images/"+fileName);
        OutputStream outputStream = response.getOutputStream();
        byte[] buffer = new byte[1024];
        int len=-1;
        // 利用io流实现下载
        while ((len=inputStream.read(buffer))!=-1){
            outputStream.write(buffer,0,len);
        }
        outputStream.close();
    }
}